/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package pe.edu.pucp.dp1.lectura.modelo;

import java.io.*;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Scanner.*;
/**
 *
 * @author Ed
 */
public class FileCar {
    public String placa;//placa de carro
    public ArrayList<RutaCar> rutaCar = new ArrayList<>();//lista de rutas que tiene el carro
    public boolean culminado;//true si el auto ya no tiene rutas pendientes segun los archivos cargados de simulacion
    public RutaCar rutaActual;//ruta actual que se esta recorriendo
    public int indexRutaActual;//indice de ruta actual reccorida respecto al arraylist rutaCar(para acceso rapido)
    
    public FileCar(){}
    
    public FileCar(File f)//constructor
    {
        setPlaca(f.getName());
        setCulminado(false);
        setRutaActual(null);//para saber que aun no se inicia
        setIndexRutaActual(-1);//para saber que aun no se inicia
        try{
            FileReader fr = new FileReader(f);
            Scanner scfr = new Scanner(fr);
            RutaCar rutacar = new RutaCar();
//            System.out.println(f.getName());
            while(scfr.hasNextLine()){
                String strline = scfr.next();
                Scanner line = new Scanner(strline);
                line.useDelimiter("[:]");
                int hhh = Integer.parseInt(line.next().toString());
                int mmm = Integer.parseInt(line.next().toString());
                line.useDelimiter("[:,]");
                int sss = Integer.parseInt(line.next().toString());
                Time hinicio = new Time(hhh,mmm,sss);
                //System.out.println(hinicio);
                line.useDelimiter("[*]");
                rutacar = new RutaCar(hinicio, line);
                line.close();
                if(rutacar!=null)
                    rutaCar.add(rutacar);
            }
            scfr.close();
            try{
                fr.close();
            }catch(IOException e){}
        }catch(FileNotFoundException e){}
    }
    
    public CoordCar getSgtePto(boolean marcarComoLeido)
    {
        CoordCar pseudoSgte= null;
        RutaCar rutaCarPosible;
        int indexrutaCarPosible;
        if(!isCulminado())
        {
            if(getRutaActual()==null)
            {
                indexrutaCarPosible=0;
                if(getRutaCar().size()>indexrutaCarPosible)//Hay pts en la ruta actual
                {
                    RutaCar pseudoRutaPosible = getRutaCar().get(indexrutaCarPosible);
                    pseudoSgte = pseudoRutaPosible.getSgtePto(marcarComoLeido);
                    if(marcarComoLeido)
                    {
                        setRutaActual(pseudoRutaPosible);
                        setIndexRutaActual(indexrutaCarPosible);
                        // setear si ya se culmino con la ruta
                        if(getRutaCar().size()-1==indexrutaCarPosible && getRutaCar().get(indexrutaCarPosible).isCulminado())
                            setCulminado(true);
                    }
                }
                else//no hay mas ptos en ruta
                    pseudoSgte=null;
            }
            else//ruta actual recorrida por completo
            {
                if(!getRutaActual().isCulminado())//quedan puntos en ruta
                {
                    pseudoSgte = getRutaActual().getSgtePto(marcarComoLeido);                
                }
                else//ya no hay puntos y se tiene q pasar a la siguiente ruta
                {
                    indexrutaCarPosible=getIndexRutaActual()+1;                
                    if(getRutaCar().size()>indexrutaCarPosible)
                    {
                        RutaCar pseudoRutaPosible = getRutaCar().get(indexrutaCarPosible);
                        pseudoSgte = pseudoRutaPosible.getSgtePto(marcarComoLeido);
                        if(marcarComoLeido)
                        {
                            setRutaActual(pseudoRutaPosible);
                            setIndexRutaActual(indexrutaCarPosible);
                            // setear si ya se culmino con la ruta
                            if(getRutaCar().size()-1==indexrutaCarPosible && getRutaCar().get(indexrutaCarPosible).isCulminado())
                                setCulminado(true);
                        }
                    }
                    else
                        pseudoSgte=null;              
                }
            }
        }
        return pseudoSgte;
    }

    public String getPlaca() {
        return placa;
    }

    public void setPlaca(String placa) {
        this.placa = placa;
    }

    public ArrayList<RutaCar> getRutaCar() {
        return rutaCar;
    }

    public void setRutaCar(ArrayList<RutaCar> rutaCar) {
        this.rutaCar = rutaCar;
    }

    public RutaCar getRutaActual() {
        return rutaActual;
    }

    public void setRutaActual(RutaCar rutaActual) {
        this.rutaActual = rutaActual;
    }

    public int getIndexRutaActual() {
        return indexRutaActual;
    }

    public void setIndexRutaActual(int indexRutaActual) {
        this.indexRutaActual = indexRutaActual;
    }

    public boolean isCulminado() {
        return culminado;
    }

    public void setCulminado(boolean culminado) {
        this.culminado = culminado;
    }
}
